package com.cl.code.database.mybatis;

import com.cl.code.database.mybatis.constant.CLMybatisConstants;
import com.cl.code.database.mybatis.module.sql.Order;
import com.cl.code.database.mybatis.module.sql.View;
import com.cl.code.database.mybatis.module.sql.Where;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author chengliang
 * @since 1.0.0
 */
public interface CoreMapper<Entity> {

    /**
     * 列表
     *
     * @param view  视图
     * @param where 条件
     * @param order 排序
     * @return 列表结果
     */
    List<Entity> list(@Param(CLMybatisConstants.VIEW_PARAM_NAME) View<Entity> view,
                      @Param(CLMybatisConstants.WHERE_PARAM_NAME) Where<Entity> where,
                      @Param(CLMybatisConstants.ORDER_PARAM_NAME) Order<Entity> order);

    /**
     * 统计
     *
     * @param where 条件
     * @return 统计
     */
    int count(@Param(CLMybatisConstants.WHERE_PARAM_NAME) Where<Entity> where);

    /**
     * 插入
     *
     * @param entity 实体
     * @return 影响行数
     */
    int insert(@Param(CLMybatisConstants.ENTITY_NAME) Entity entity);

    /**
     * 通过条件匹配更新
     *
     * @param entity 实体
     * @param where  条件
     * @return 影响行数
     */
    int update(@Param(CLMybatisConstants.ENTITY_NAME) Entity entity,
               @Param(CLMybatisConstants.WHERE_PARAM_NAME) Where<Entity> where);

    /**
     * 通过条件匹配更新（忽略空值）
     *
     * @param entity 实体
     * @param where  条件
     * @return 影响行数
     */
    int updateSelective(@Param(CLMybatisConstants.ENTITY_NAME) Entity entity,
                        @Param(CLMybatisConstants.WHERE_PARAM_NAME) Where<Entity> where);

    /**
     * 通过条件匹配删除
     *
     * @param where 条件
     * @return 影响行数
     */
    int delete(@Param(CLMybatisConstants.WHERE_PARAM_NAME) Where<Entity> where);

}
